﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Web.UI.WebControls;
using ClickLand.CorporacionPlaza.Presentacion.Contratos.AdministracionCliente;
using ClickLand.CorporacionPlaza.Presentacion.CorporacionPlazaWS;
using ClickLand.CorporacionPlaza.Presentacion.Presentadores.AdministracionCliente;
using ClickLand.Web.UI.WebControls;
using Resources;

namespace AdministracionCliente
{
    /// <summary> Clase que hace de code behind para la vista que administra los clientes </summary>
    public partial class AdministrarCliente : System.Web.UI.Page, IAdministrarCliente
    {
        #region Atributos

        /// <summary> Objeto que posee la definicion del presentador de la vista </summary>
        private PresentadorAdministrarCliente _presentador; 
    
        #endregion

        #region Eventos

        /// <summary> Metodo que se ejecuta cuando se carga la pagina por primera vez </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;
            gridBusqueda.Visible = false;
            _presentador.CargarPagina();
        }


        /// <summary>Evento de inicializacion de la página.</summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void Page_Init(object sender, EventArgs e)
        {
            _presentador = new PresentadorAdministrarCliente(this);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de cancelar en la ventana de busqueda </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnCancelarBuscarClienteOnClick(object sender, EventArgs e)
        {
            Response.Redirect("AdministrarCliente.aspx");
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de crear cliente </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnCrearClienteOnClick(object sender, EventArgs e)
        {
            Response.Redirect("AgregarCliente.aspx");
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de buscar cliente </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnBuscarClienteOnClick(object sender, EventArgs e)
        {
            _presentador.ConsultarClientes();
            ConfigurarControles();
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton cancelar en la vista de editar cliente </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnCancelarEditarClienteOnClick(object sender, EventArgs e)
        {
            mvPanelAdministrarCliente.SetActiveView(vDetalleCliente);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de aceptar de la vista de exito de modificacion </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnAceptarExito(object sender, EventArgs e)
        {
            Response.Redirect("AdministrarCliente.aspx");
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de regresar de la venta de error </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnRegresarErrorOnClick(object sender, EventArgs e)
        {
            mvPanelAdministrarCliente.SetActiveView(vEditarCliente);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton siguiente de la paginacion
        /// de la lista de clientes </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnSiguientePaginacionOnClick(object sender, EventArgs e)
        {
            if (gvListaClientes.PageIndex < gvListaClientes.PageCount)
                gvListaClientes.PageIndex++;

            gvListaClientes.DataSource = Session["listaCliente"];
            gvListaClientes.DataBind();
            ConfigurarControles();
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton anterior de la paginacion
        /// de la lista de clientes </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnAnteriorPaginacionOnClick(object sender, EventArgs e)
        {
            if (gvListaClientes.PageIndex > 0)
                gvListaClientes.PageIndex--;
            gvListaClientes.DataSource = Session["listaCliente"];
            gvListaClientes.DataBind();

            ConfigurarControles();
        }


        /// <summary> Metodo que realiza las operaciones para configurar la visibilidad de los botones
        /// y el texto de información </summary>
        private void ConfigurarControles()
        {
            lblInfoPaginado.Visible = gvListaClientes.PageCount >= 1;
            lblInfoPaginado.Text = string.Format("Página {0}/{1} - Total Registros {2}",
                gvListaClientes.PageIndex + 1, gvListaClientes.PageCount,
                ((List<ClienteDto>)gvListaClientes.DataSource).Count);
            btnAnteriorPag.Visible = (gvListaClientes.PageIndex > 0);
            btnSiguientePag.Visible = (gvListaClientes.PageIndex < gvListaClientes.PageCount - 1) &&
                             (gvListaClientes.PageCount > 1);
            lblSinCliente.Visible = gvListaClientes.Rows.Count == 0;
            btnImprimi.Visible = gridBusqueda.Visible = !lblSinCliente.Visible;
        }


        /// <summary> Metodo que se ejecuta cuando se da click al hipervinculo de la tabla </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void GvListasClientesSelectedIndexChange(object sender, EventArgs e)
        {
            int id = Convert.ToInt32(gvListaClientes.SelectedDataKey.Value);
            _presentador.MostrarDetalle(id);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de regresar en el detalle </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnRegresarDetalleClienteOnClick(object sender, EventArgs e)
        {
            mvPanelAdministrarCliente.SetActiveView(vConsultarCliente);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de editar </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnEditarDetalleClienteOnClick(object sender, EventArgs e)
        {
            _presentador.MostrarEdicion();
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de cancelar la edicion </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnCancelarEdicionClienteOnClick(object sender, EventArgs e)
        {
            mvPanelAdministrarCliente.SetActiveView(vDetalleCliente);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de aceptar la edicion </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnAceptarEdicionClienteOnClick(object sender, EventArgs e)
        {
            _presentador.MostrarConfirmacion();
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de regresar en la confirmacion de la edicion </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnRegresarConfirmacionEditarClienteOnClick(object sender, EventArgs e)
        {
            mvPanelAdministrarCliente.SetActiveView(vEditarCliente);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de aceptar en la confirmacion de edicion </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnAceptarConfirmacionEdtarClienteOnClick(object sender, EventArgs e)
        {
            Page.Validate("AgregarCliente");
            if (Page.IsValid)
            _presentador.EditarCliente();
        }


        /// <summary> Metodo que se ejecuta cuando se selecciona el tipo de cliente </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void DdlTipoClienteOnSelected(object sender, EventArgs e)
        {
            _presentador.SeleccionarTipoCliente();
        }
        #endregion

        #region Propiedades

        /// <summary> Propiedad que retorna el control para el nombre de la busqueda </summary>
        public ClickLandExTextBox NombreBusqueda
        {
            get { return tbNombreConsulta; }
        }


        /// <summary> Propiedad que retorna el control que lista los diferentes estados del cliente </summary>
        public ClickLandDropDownList Estados
        {
            get { return ddlEstados; }
        }


        /// <summary> Propiedad que retorna el control para lista los clientes que coincidan con los parametros de busqueda </summary>
        public ClickLandGridView Clientes
        {
            get { return gvListaClientes; }
        }


        /// <summary> Propiedad que retorna el control que maneja las diferentes vistas </summary>
        public MultiView Paneles
        {
            get { return mvPanelAdministrarCliente; }
        }


        /// <summary> Propiedad que retorna el control que muestra el detalle de un cliente </summary>
        public View VistaDetalle
        {
            get { return vDetalleCliente; }
        }


        /// <summary> Propiedad que retorna el control que muestra el nombre del cliente en la confirmacion </summary>
        public ClickLandLabel NombreDetalle
        {
            get { return lblNombreDetalle; }
        }


        /// <summary> Propiedad que retorna el control que muestra el correo de del cliente en la confirmacion </summary>
        public ClickLandLabel CorreoDetalle
        {
            get { return lblCorreoDetalle; }
        }


        /// <summary> Propiedad que retorna el control que muestra el documento de identificacion del cliente en la confirmacion </summary>
        public ClickLandLabel DocumentoIdentificacionDetalle
        {
            get { return lblDocumentoDetalle; }
        }


        /// <summary> Propiedad que retorna el control que muestra el numero de celular del cliente en la confirmacion </summary>
        public ClickLandLabel NumeroCelularDetalle
        {
            get { return lblTelefonoCelularDetalle; }
        }


        /// <summary> Propiedad que retorna el control que muestra el numero de la oficina del cliente en la confirmacion </summary>
        public ClickLandLabel NumeroOficinaDetalle
        {
            get { return lblTelefonoOficinaDetalle; }
        }


        /// <summary> Propiedad que retorna el control que muestra el responsable del cliente en la confirmacion </summary>
        public ClickLandLabel Responsable1Detalle
        {
            get { return lblResponsable1Detalle; }
        }


        /// <summary> Propiedad que retorna el control que muestra el responsable2 del cliente en la confirmacion </summary>
        public ClickLandLabel Responsable2Detalle
        {
            get { return lblResponsable2Detalle; }
        }


        /// <summary> Propiedad que retorna el control que muestra el responsable3 del cliente en la confirmacion </summary>
        public ClickLandLabel Responsable3Detalle
        {
            get { return lblResponsable3Detalle; }
        }


        /// <summary> Propiedad que retorna el control que muestra el tipo de cliente seleccionado </summary>
        public ClickLandLabel TipoClienteDetalle
        {
            get { return lblTipoClienteDetalle; }
        }


        /// <summary> Propiedad que retorna el control que muestra los tipos de cliente </summary>
        public ClickLandDropDownList TipoCliente
        {
            get { return ddlTipoCliente; }
        }


        /// <summary> Propiedad que retorna el control que lista la cedula </summary>
        public ClickLandDropDownList LetraCedulaRif
        {
            get { return ddlTipoDocumento; }
        }


        /// <summary> Propiedad que retorna el control donde se indica el nombre del cliente </summary>
        public ClickLandExTextBox Nombre
        {
            get { return tbNombreCliente; }
        }


        /// <summary> Propiedad que retorna el control donde se indica el rif del cliente </summary>
        public ClickLandExTextBox CedulaRif
        {
            get { return tbDocumento; }
        }


        /// <summary> Propiedad que retorna el control donde se indica el codigo de area del celular </summary>
        public ClickLandDropDownList CodigoAreaCelular
        {
            get { return ddlCodigoAreaCelular; }
        }


        /// <summary> Propiedad que retorna el control donde se indica el numero de telefono del celular </summary>
        public ClickLandExTextBox TelefonoCelular
        {
            get { return tbTelefonoCelular; }
        }


        /// <summary> Propiedad que retorna el control donde se indica el codigo de area de la oficina </summary>
        public ClickLandExTextBox CodigoAreaOficina
        {
            get { return tbCodigoAreaTelefonoOficina; }
        }


        /// <summary> Propiedad que retorna el control donde se indica el numero de telefono de la oficina </summary>
        public ClickLandExTextBox TelefonoOficina
        {
            get { return tbTelefonoOficina; }
        }


        /// <summary> Propiedad que retorna el control donde se indica el correo electronico</summary>
        public ClickLandExTextBox Correo
        {
            get { return tbEmail; }
        }


        /// <summary> Propiedad que retorna el control que muestra el mensaje de error </summary>
        public View VistaError
        {
            get { return vMensajeError; }
        }


        /// <summary> Propiedad que retorna el control que muestra el mensaje de exito </summary>
        public View VistaExito
        {
            get { return vMensajeExito; }
        }


        /// <summary> Propiedad que retorna el control que muestra los controles para la modificacion </summary>
        public View VistaModificacion
        {
            get { return vEditarCliente; }
        }


        /// <summary> Propiedad que retorna el control que muestra la vista de confirmacion </summary>
        public View VistaConfirmacion
        {
            get { return vConfirmacion; }
        }



        /// <summary> Propiedad que retorna el control que indica el nombre del responsable1 </summary>
        public ClickLandExTextBox Responsable1
        {
            get { return tbResponsable1; }
        }


        /// <summary> Propiedad que retorna el control que indica el nombre del responsable3 </summary>
        public ClickLandExTextBox Responsable2
        {
            get { return tbResponsable2; }
        }


        /// <summary> Propiedad que retorna el control que indica el nombre del responsable3 </summary>
        public ClickLandExTextBox Responsable3
        {
            get { return tbResponsable3; }
        }

        /// <summary> Propiedad que retorna el control que muestra el nombre del cliente en la confirmacion </summary>
        public ClickLandLabel NombreConfirmacion
        {
            get { return lblNombreConfirmacion; }
        }


        /// <summary> Propiedad que retorna el control que muestra el correo de del cliente en la confirmacion </summary>
        public ClickLandLabel CorreoConfirmacion
        {
            get { return lblCorreoConfirmacion; }
        }


        /// <summary> Propiedad que retorna el control que muestra el documento de identificacion del cliente en la confirmacion </summary>
        public ClickLandLabel DocumentoIdentificacionConfirmacion
        {
            get { return lblDocumentoConfirmacion; }
        }


        /// <summary> Propiedad que retorna el control que muestra el numero de celular del cliente en la confirmacion </summary>
        public ClickLandLabel NumeroCelular
        {
            get { return lblTelefonoCelularConfirmacion; }
        }


        /// <summary> Propiedad que retorna el control que muestra el numero de la oficina del cliente en la confirmacion </summary>
        public ClickLandLabel NumeroOficina
        {
            get { return lblTelefonoOficinaConfirmacion; }
        }


        /// <summary> Propiedad que retorna el control que muestra el responsable del cliente en la confirmacion </summary>
        public ClickLandLabel Responsable1Confirmacion
        {
            get { return lblResponsable1Confirmacion; }
        }


        /// <summary> Propiedad que retorna el control que muestra el responsable2 del cliente en la confirmacion </summary>
        public ClickLandLabel Responsable2Confirmacion
        {
            get { return lblResponsable2Confirmacion; }
        }


        /// <summary> Propiedad que retorna el control que muestra el responsable3 del cliente en la confirmacion </summary>
        public ClickLandLabel Responsable3Confirmacion
        {
            get { return lblResponsable3Confirmacion; }
        }


        /// <summary> Propiedad que retorna el control que muestra el tipo de cliente seleccionado </summary>
        public ClickLandLabel TipoClienteConfirmacion
        {
            get { return lblTipoClienteConfirmacion; }
        }


        /// <summary> Propiedad que asigna la visibilidad de los controles segun el tipo de cliente </summary>
        public bool EsClienteJuridico
        {
            set
            {

                lblResponsable3Detalle.Visible = value;
                ClickLandLabel8.Visible = value;
                ClickLandLabel9.Visible = value;
                lblResponsable1Detalle.Visible = value;
                lblResponsable2Detalle.Visible = value;
                ClickLandLabel4.Visible = value;
                lblResposanble1.Visible = value;
                tbResponsable1.Visible = value;
                lblResponsable2.Visible = value;
                tbResponsable2.Visible = value;
                ClickLandLabel3.Visible = value;
                tbResponsable3.Visible = value;
                ClickLandLabel14.Visible = value;
                lblResponsable1Confirmacion.Visible = value;
                ClickLandLabel15.Visible = value;
                lblResponsable2Confirmacion.Visible = value;
                ClickLandLabel16.Visible = value;
                lblResponsable3Confirmacion.Visible = value;
            }
        }


        /// <summary> Propiedad que obtiene el objeto que lista los contratos del cliente </summary>
        public ClickLandGridView ListaContratos
        {
            get { return gvListaContratos; }
        }

        public string TituloReporte
        {
            get { return Etiquetas.TituloReporteCliente; }
        }

        #endregion


        /// <summary> Metodo que obtiene el nombre de un estado dado su valor </summary>
        /// <param name="estado">estado a obtener el valor</param>
        /// <returns>nombre del estado</returns>
        protected string NombreEstado(int estado)
        {
            return Enum.GetName(typeof (ClickLand.CorporacionPlaza.Utilidades.Estados), estado);
        }


        /// <summary> Metodo que valida la seleccion de los telefonos del cliente </summary>
        /// <param name="source"></param>
        /// <param name="args"></param>
        protected void ValidarTelefonos(object source, ServerValidateEventArgs args)
        {
            bool invalidoCelular = (ddlCodigoAreaCelular.SelectedIndex == 0) ||
                                   string.IsNullOrEmpty(tbTelefonoCelular.Text);
            bool invalidoOficina = (tbCodigoAreaTelefonoOficina.Text.Length < 4) ||
                                   string.IsNullOrEmpty(tbCodigoAreaTelefonoOficina.Text);

            args.IsValid = !(invalidoCelular && invalidoOficina);

        }

        /// <summary> Metodo que se ejecuta cuando se da click al boton de imprimir  </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnImprimir(object sender, EventArgs e)
        {
            Response.ClearContent();
            Response.ClearHeaders();
            Response.ContentType = "application/pdf";
            Response.AddHeader("Content-Disposition", "attachment; filename=" + "ReporteConsultaCliente.pdf");
            Response.TransmitFile(ConfigurationManager.AppSettings["RutaDescarga"] + "ReporteConsultaCliente.pdf");
            Response.End();
            Response.Flush();
            Response.Clear();
        }


        /// <summary> Metodo que se ejecuta cuando se da crea una fila del grid view de contratos </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GvDatosContratosRowDataBound(object sender, GridViewRowEventArgs e)
        {

            if (e.Row.RowType != DataControlRowType.DataRow) return;

            var estado = ((Literal)e.Row.FindControl("literalEstado")).Text;
            ((Literal)e.Row.FindControl("literalEstado")).Text = estado == "0" ? Etiquetas.Inactivo : Etiquetas.Activo;

            if (estado != "0") return;
            e.Row.BackColor = Color.Red;
            e.Row.ForeColor = Color.White;
        }


        /// <summary>
        /// Metodo que se ejecuta cuando se da click al boton regresar en la vista del reporte
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnRegresarReporte(object sender, EventArgs e)
        {
            mvPanelAdministrarCliente.SetActiveView(vConsultarCliente);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de generar pdf </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnGenerarPdf(object sender, EventArgs e)
        {
            _presentador.ImprimirReporte();
            myPDF.Attributes["src"] = ConfigurationManager.AppSettings["RutaDescargaOnLine"] + "ReporteConsultaCliente.pdf";
            mvPanelAdministrarCliente.SetActiveView(vReporte);

        }
    }
}